#include <tim.h>

 u8 timer4_state=0;
extern u8 flag100ms;
extern u8 flag1min;
int tmr1min=0;
//void PWM3_Init(void)						
//{
//	GPIO_InitTypeDef GPIO_InitStructurc_B;
//	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);	//使能GPIO_A端口
//	
//	GPIO_InitStructurc_B.GPIO_Mode=GPIO_Mode_Out_PP;			//GPIO_A配置			推挽输出
//	GPIO_InitStructurc_B.GPIO_Pin=GPIO_Pin_0;					//设置对应引脚			输出pwm		TIM3通道1
//  GPIO_InitStructurc_B.GPIO_Pin=GPIO_Pin_1;					//设置对应引脚			输出pwm		TIM3通道2
//	GPIO_InitStructurc_B.GPIO_Speed=GPIO_Speed_50MHz;			//选择最大反转速度（2、10、50）
//	GPIO_Init(GPIOB,&GPIO_InitStructurc_B);					//GPIOA初始化
////  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //映射，重映射只用于64、100、144脚单片机
////	GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);  //注意失能JTAG
////	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //使能SWD 禁用JTAG
//   //当没有重映射时，TIM3的四个通道CH1，CH2，CH3，CH4分别对应PA6，PA7,PB0,PB1
//   //当部分重映射时，TIM3的四个通道CH1，CH2，CH3，CH4分别对应PB4，PB5,PB0,PB1 (GPIO_PartialRemap_TIM3)
//   //当完全重映射时，TIM3的四个通道CH1，CH2，CH3，CH4分别对应PC6，PC7,PC8,PC9 (GPIO_FullRemap_TIM3) 

//}

//通用定时器2中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器2!
void TIM2_Int_Init(u16 arr_2,u16 psc_2)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure_2;
	NVIC_InitTypeDef NVIC_InitStructure_2;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
	
	//定时器TIM2初始化
	TIM_TimeBaseStructure_2.TIM_Period = arr_2; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure_2.TIM_Prescaler =psc_2; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure_2.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure_2.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure_2); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure_2.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
	NVIC_InitStructure_2.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure_2.NVIC_IRQChannelSubPriority = 2;  //从优先级2级
	NVIC_InitStructure_2.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure_2);  //初始化NVIC寄存器
	
	TIM_Cmd(TIM2, ENABLE);  //使能TIMx					 
}
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr_3,u16 psc_3)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure_3;
	NVIC_InitTypeDef NVIC_InitStructure_3;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure_3.TIM_Period = arr_3; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure_3.TIM_Prescaler =psc_3; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure_3.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure_3.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure_3); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
	//中断优先级NVIC设置
	NVIC_InitStructure_3.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure_3.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure_3.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure_3.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure_3);  //初始化NVIC寄存器
	
	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}
//通用定时器4中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器4!
void TIM4_Int_Init(u16 arr_4,u16 psc_4)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure_4;
	NVIC_InitTypeDef NVIC_InitStructure_4;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure_4.TIM_Period = arr_4; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure_4.TIM_Prescaler =psc_4; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure_4.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure_4.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure_4); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure_4.NVIC_IRQChannel = TIM4_IRQn;  //TIM4中断
	NVIC_InitStructure_4.NVIC_IRQChannelPreemptionPriority = 3;  //先占优先级3级
	NVIC_InitStructure_4.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure_4.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure_4);  //初始化NVIC寄存器
	
	TIM_Cmd(TIM4, ENABLE);  //使能TIMx					 
}
//通用定时器5中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器3!
void TIM5_Int_Init(u16 arr_5,u16 psc_5)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure_5;
	NVIC_InitTypeDef NVIC_InitStructure_5;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure_5.TIM_Period = arr_5; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure_5.TIM_Prescaler =psc_5; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure_5.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure_5.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure_5); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE ); //使能指定的TIM5中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure_5.NVIC_IRQChannel = TIM4_IRQn;  //TIM5中断
	NVIC_InitStructure_5.NVIC_IRQChannelPreemptionPriority = 3;  //先占优先级3级
	NVIC_InitStructure_5.NVIC_IRQChannelSubPriority = 2;  //从优先级2级
	NVIC_InitStructure_5.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure_5);  //初始化NVIC寄存器
	
	TIM_Cmd(TIM5, ENABLE);  //使能TIMx					 
}
/*-----------------------------------------------------------------------------------------------------*/
/***********************************上一部分定时器初始化***********************************************/
/********************************下一部分定时器中断服务函数********************************************/
/*-----------------------------------------------------------------------------------------------------*/
//定时器2中断服务程序
void TIM2_IRQHandler(void)   //TIM2中断
{
	if (TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)  //检查TIM3更新中断发生与否
		{
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清除TIMx更新中断标志 
		/*
			---------------如果使用自己定义定时器中断代码-------------
		*/	
		}
}

//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)  //检查TIM3更新中断发生与否
		{
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除TIMx更新中断标志 
		/*
			---------------如果使用自己定义定时器中断代码-------------
		*/	
		}
}
//定时器4中断服务程序   每1Ms产生中断
void TIM4_IRQHandler(void)   //TIM4中断
{
	static u8 tmr100ms;
	if (TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)  //检查TIM4更新中断发生与否
		{
			timer4_state++;
			tmr100ms++;
			tmr1min++;
		if(tmr100ms>=100)
		{
			tmr100ms=0;
			flag100ms=1;
		}
		if(tmr1min>=10000)
		{
			tmr1min=0;
			flag1min=1;
		}
		/*
			--------------如果使用自己定义定时器中断代码-------------
		*/	
		}
		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //清除TIMx更新中断标志 
}
//定时器5中断服务程序
void TIM5_IRQHandler(void)   //TIM5中断
{
	if (TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)  //检查TIM5更新中断发生与否
		{
		TIM_ClearITPendingBit(TIM5,TIM_IT_Update);  //清除TIMx更新中断标志 
		/*
			-------------如果使用自己定义定时器中断代码-------------
		*/	
		}
}

void TIM3_PWM_Init(u16 arr,u16 psc){  //TIM3 PWM初始化 arr重装载值 psc预分频系数
    GPIO_InitTypeDef     GPIO_InitStrue;
    TIM_OCInitTypeDef     TIM_OCInitStrue;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;
    
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3和相关GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟(LED在PB0引脚)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
//  GPIO_InitStrue.GPIO_Pin = GPIO_Pin_12; 
//	GPIO_InitStrue.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
//	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_Init(GPIOB, &GPIO_InitStrue);
//	GPIO_ResetBits(GPIOB,GPIO_Pin_12);       
//	
//	//初始化IOPA5
//	GPIO_InitStrue.GPIO_Pin = GPIO_Pin_13; 
//	GPIO_InitStrue.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
//	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_Init(GPIOB,&GPIO_InitStrue);
//	GPIO_ResetBits(GPIOB,GPIO_Pin_13);    

    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0;     // TIM_CH3
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);                //GPIO端口初始化设置
		
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_1;     // TIM_CH4
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度
    GPIO_Init(GPIOB,&GPIO_InitStrue); 
//    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //映射，重映射只用于64、100、144脚单片机
   //当没有重映射时，TIM3的四个通道CH1，CH2，CH3，CH4分别对应PA6，PA7,PB0,PB1
   //当部分重映射时，TIM3的四个通道CH1，CH2，CH3，CH4分别对应PB4，PB5,PB0,PB1 (GPIO_PartialRemap_TIM3)
   //当完全重映射时，TIM3的四个通道CH1，CH2，CH3，CH4分别对应PC6，PC7,PC8,PC9 (GPIO_FullRemap_TIM3) 
	      
    TIM_TimeBaseInitStrue.TIM_Period=arr;    //设置自动重装载值
    TIM_TimeBaseInitStrue.TIM_Prescaler=psc;        //预分频系数
    TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;    //计数器向上溢出
    TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;        //时钟的分频因子，起到了一点点的延时作用，一般设为TIM_CKD_DIV1
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);        //TIM3初始化设置(设置PWM的周期)
    
    TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1;        // PWM模式1:CNT < CCR时输出有效电平
    TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为：高电平
    TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
    TIM_OC3Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道3 PWM 模式设置
		TIM_OC4Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道4 PWM 模式设置
    TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器
		TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器
		
   
    
    TIM_Cmd(TIM3,ENABLE);        //使能TIM3
    
}

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr：自动重装值
//psc：时钟预分频数
//void TIM3_PWM_Init(u16 arr,u16 psc)
//{  
//	GPIO_InitTypeDef     GPIO_InitStrue;
//	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
//	TIM_OCInitTypeDef  TIM_OCInitStructure;
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设时钟
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
// //初始化IO
//	  GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0;     // TIM_CH3
//    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
//    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度
//    GPIO_Init(GPIOB,&GPIO_InitStrue);   
////   GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //映射，重映射只用于64、100、144脚单片机
////   GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);  //注意失能JTAG	
//   //初始化TIM3
//	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
//	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
//	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
//	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
//	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//	
//	//初始化TIM3 Channel2 PWM模式	 
//	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
// 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
//	
////	TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC1	    PA_6
////	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2		  PA_7
//	TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC3       PB_0
//	TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC4       PB_0
//	
////	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
////	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
//	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR3上的预装载寄存器
//	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR4上的预装载寄存器
// 
//	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
//}
